/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.negocio;

import entidades.Cliente;
import comandos.CmdBD;
import comandos.Ins.CmdInsCliente;
import comandos.Up.CmdUpCliente;
import comandos.Sel.CmdSelCliente;
import comandos.Up.CmdUpClienteHasReserva;
import erros.ErroAtualizacao;
import erros.ErroCadastramento;
import erros.ErroRecuperacao;
import erros.ErroPersistencia;
import interfaces.IGerenciaCliente;
import interfaces.IPersistencia;
/**
 *
 * Controladora de negócio da entidade cliente.
 * @author thiagostuckert
 * @author daniel
 */
public class CntrGerenciaCliente implements IGerenciaCliente {
    /**
     * Referência para o singleton da controladora
     * de negócio da entidade cliente.
     */
    private static CntrGerenciaCliente ref;
    /**
     * Referência para a controladora de persistência (stub ou real),
     * associada à essa controladora.
     */
    private IPersistencia cntrPersistencia;

    /**
     * Associa à essa controladora a controladora de persistência.
     * @param cntrParam Controladora de persistência à ser associada
     * com essa controladora.
     */
    public final void setCntrPersistencia(final IPersistencia cntrParam) {
        cntrPersistencia = cntrParam;
    }

    /**
     * Instancia o singleton da controladora.
     * @return Retorna a referência para o singleton da controladora.
     */
    public static CntrGerenciaCliente instanciar() {
        if (ref == null) {
            ref = new CntrGerenciaCliente();
        }
        return (ref);
    }
    /**
     * Cadastra o cliente no banco de dados.
     * @param cliente Cliente a ser cadastrado.
     * @throws ErroCadastramento Lança a exceção de erro de cadastramento
     * em caso de falha.
     */
    @Override
    public void cadastrarCliente(final Cliente cliente)
            throws ErroCadastramento{
        try{
            CmdBD cmdInsCliente = new CmdInsCliente(cliente);
            cntrPersistencia.executar(cmdInsCliente);
        } catch (ErroPersistencia e) {
            throw new ErroCadastramento("Erro no cadastramento do cliente");
        }
    }
    /**
     * Atualiza um cliente no banco de dados.
     * @param cliente Cliente à ser adicionado
     * @param clienteNovo Novos atributos do cliente
     * @throws ErroAtualizacao lança exceção de erro de atualização em caso
     * de falha.clienteNovo.getCpf()
     */
    @Override
    public void atualizarCliente(Cliente cliente,Cliente clienteNovo)
            throws ErroAtualizacao {
        try{
            CmdBD cmdUpCliente = new CmdUpCliente(cliente, clienteNovo);
            cntrPersistencia.executar(cmdUpCliente);
            cmdUpCliente = new CmdUpClienteHasReserva(cliente, clienteNovo);
            cntrPersistencia.executar(cmdUpCliente);
        } catch (ErroPersistencia e) {
            throw new ErroAtualizacao("Erro na atualizacao do cliente");
        }
    }
    /**
     * Recupera um cliente do banco de dados.
     * @param cliente à ser recuperado.
     * @return cliente recuperado do banco de dados
     * @throws ErroRecuperacao lança a exceção de erro de recuperação
     * em caso de falha.
     */
    @Override
    public Cliente recuperarCliente(Cliente cliente) throws ErroRecuperacao {
        try {
            CmdBD cmdSelcliente = new CmdSelCliente(cliente);

            return((Cliente) cntrPersistencia.executar(cmdSelcliente));

        } catch(ErroPersistencia e){
            throw new ErroRecuperacao("Erro na recuperação do cliente");
        }
    }

}
